#include "tarefa/gerenciador.h"

#include "SDL.h"
#include "tarefa/tarefa.h"

#include <list>

using namespace std;

namespace tarefa {

void gerenciador::cadastra(tarefa* _t) {
  lista_.push_back(_t);
}

void gerenciador::roda(int tempo) {
  static list<tarefa*>::iterator it_ = lista_.begin();
  static int ultimo = SDL_GetTicks();
  int inicio = SDL_GetTicks();
  int passou = inicio - ultimo;
  list<tarefa*>::iterator it = it_;
  do {
    if (!(*it)->dormindo && !(*it)->executa(passou)) {
      delete *it;
      it = lista_.erase(it);
    } else
      it++;
    if (it == lista_.end())
      it = lista_.begin();
  } while( it != it_ && (tempo == -1 || (SDL_GetTicks() - inicio) < tempo ));
  it_ = it;
  ultimo = inicio;
}

gerenciador::~gerenciador() {
  list<tarefa*>::iterator it;
  for (it = lista_.begin() ; it != lista_.end() ; it++ )
    if ( (*it)->deleta_ )
      delete *it;
}

}

